package main

import (
	"fmt"
	"sort"
)

func main() {

	//值类型
	//基本数据类型 数组 都是值类型
	// var a = 10
	// b := a
	// fmt.Println(a, b)
	// a = 20
	// fmt.Println(a, b)
	// arr1 := [3]int{1, 2, 3}
	// arr2 := arr1
	// fmt.Println(arr1, arr2, "数组")
	// arr1[0] = 333
	// fmt.Println(arr1, arr2, "修改后数组")

	// //引用类型
	// //切片
	// qp := []int{1, 2, 3}
	// qp2 := qp
	// fmt.Println(qp, qp2, "切片")
	// qp[0] = 10
	// fmt.Println(qp, qp2, "修改后切片")

	//多维数组
	// arr3 := [3][2]string{
	// 	{"上", "下"},
	// 	{"左", "右"},
	// 	{"前", "后"},
	// }
	// //for循环
	// for i := 0; i < len(arr3); i++ {
	// 	for j := 0; j < len(arr3[0]); j++ {
	// 		fmt.Println(arr3[i][j])
	// 	}
	// }

	// //range来循环
	// for _, v1 := range arr3 {
	// 	for _, v2 := range v1 {
	// 		fmt.Println(v2)
	// 	}
	// }

	// //数组默认元素为0
	// // [0 0 0]
	// var arr5 [3]int
	// fmt.Println(arr5)

	// //切片，默认是空
	// //声明切片，默认值是nil
	// // [] == nil
	// var qiep []int
	// fmt.Println(qiep)

	// //基于数组定义切片
	// a := [5]int{1, 2, 3, 4, 5}
	// b := a[:]
	// //b=[1 2 3 4 5], type=[]int
	// fmt.Printf("b=%v, type=%T", b, b)

	//切片是引用类型，数组是值类型
	//切片的长度和容量，切片的底层是数组
	//长度 容量
	//长度：多少个
	//容量：从第一个元素，到 底层数组 末尾的个数
	// arr6 := [5]int{1, 2, 3, 4, 5}
	// qp1 := arr6[:]                                             //[1 2 3 4 5]
	// qp2 := arr6[2:]                                            //[3 4 5]
	// qp3 := arr6[:3]                                            //[1 2 3]
	// qp4 := arr6[1:3]                                           //[2 3]
	// fmt.Printf("qp1=%v 长度%v, 容量%v\n", qp1, len(qp1), cap(qp1)) // 长度5 容量5: 从1开始 1 2 3 4 5
	// fmt.Printf("qp2=%v 长度%v, 容量%v\n", qp2, len(qp2), cap(qp2)) // 长度3 容量3: 从3开始 3 4 5
	// fmt.Printf("qp3=%v 长度%v, 容量%v\n", qp3, len(qp3), cap(qp3)) // 长度3 容量5: 从1开始 1 2 3 4 5
	// fmt.Printf("qp4=%v 长度%v, 容量%v\n", qp4, len(qp4), cap(qp4)) // 长度2 容量4: 从2开始 2 3 4 5

	// //使用make定义切片
	// var qp = make([]int, 3, 3)
	// fmt.Printf("qp=%v, 长度%v, 容量%v\n", qp, len(qp), cap(qp))

	// //切片扩容策略
	// //容量小于1024，翻倍扩容
	// //通过append进行切片元素增加
	// qp = append(qp, 12)
	// fmt.Printf("qp=%v, 长度%v, 容量%v\n", qp, len(qp), cap(qp)) // 4个元素 容量3 --》 6
	// qp = append(qp, 12, 12, 34)
	// fmt.Printf("qp=%v, 长度%v, 容量%v\n", qp, len(qp), cap(qp)) //7个元素容量由6 --》 12
	// qp = append(qp, 12, 1, 2, 3, 12, 12)
	// fmt.Printf("qp=%v, 长度%v, 容量%v\n", qp, len(qp), cap(qp)) //13个元素 容量由12 ---》 24

	// //切片与切片合并
	// qp1 := []int{1, 2, 3}
	// qp2 := []int{3, 4, 5}
	// qp3 := append(qp1, qp2...)
	// fmt.Println(qp3)

	// //切片是引用类型，副本会受影响
	// //使用copy 不相互影响
	// qp4 := []int{1, 2, 3}
	// qp5 := qp4
	// qp4[0] = 444
	// fmt.Println(qp4, qp5) //均为[444 2 3]

	// qp6 := make([]int, 3, 3)
	// copy(qp6, qp4) //把qp4 复制给 qp6
	// qp4[0] = 555
	// qp6[0] = 888
	// fmt.Println(qp4, qp6) //[555 2 3]  [888 2 3]

	//删除索引
	// qp := []int{1, 2, 3, 4, 5}
	// //删除索引为2的数，注意，append合并切片，第二个得加上...
	// qp = append(qp[:2], qp[3:]...)

	// fmt.Println(qp)

	// //修改字符串
	// s1 := "abcde"
	// byteStr := []byte(s1)
	// byteStr[0] = 'p'
	// fmt.Println(string(byteStr))

	// s2 := "fffff"
	// runeStr := []rune(s2)
	// runeStr[0] = 'g'
	// fmt.Println(string(runeStr))

	// var numSlice = []int{9, 7, 3, 5, 6}
	// for i := 1; i < len(numSlice); i++ {
	// 	for j := 0; j < len(numSlice)-i; j++ {
	// 		if numSlice[j] > numSlice[j+1] {
	// 			tmp := numSlice[j]
	// 			numSlice[j] = numSlice[j+1]
	// 			numSlice[j+1] = tmp
	// 		}
	// 	}
	// 	fmt.Println(numSlice)
	// }
	// fmt.Println(numSlice)

	//排序
	//升序
	a := []int{9, 8, 7, 6, 10, 3}
	b := []float64{1.3, 0.9, 2.1, 3.0}
	c := []string{"ag", "af", "e", "c", "g", "b"}
	// sort.Ints(a)
	// sort.Float64s(b)
	// sort.Strings(c)
	// fmt.Println(a)
	// fmt.Println(b)
	// fmt.Println(c)

	//降序
	sort.Sort(sort.Reverse(sort.IntSlice(a)))
	sort.Sort(sort.Reverse(sort.Float64Slice(b)))
	sort.Sort(sort.Reverse(sort.StringSlice(c)))
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)

}
